package main

import (
	"fmt"
	. "go_data_structures_and_algorithms/tool"
)

/*
定义栈的数据结构，请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中，调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路:
1.创建两个栈
2.第一个栈放入数据的时候同步放入
3.第二个栈也同步放入数据不过要与栈顶的数据进行比较如果比他大就加入栈顶的元素否则就加入新的数据
4.创建一个GetMin函数直接取第二个栈的栈顶就完事了
*/

type MinShed struct {
	orginShed MyShed[int]
	backShed  MyShed[int]
}

func (min *MinShed) Pop() {
	min.backShed.Poll()
	min.orginShed.Poll()
}
func (min *MinShed) Push(value int) {
	if min.backShed.Head != nil {
		if value > min.backShed.Head.Value {
			min.backShed.Offer(min.backShed.Head.Value)

		} else {
			min.backShed.Offer(value)
		}
	} else {
		min.backShed.Offer(value)
	}

	min.orginShed.Offer(value)

}
func (min *MinShed) GetMin() int {

	return min.backShed.Peek()
}
func main() {

	shed := MinShed{
		orginShed: MyShed[int]{},
		backShed:  MyShed[int]{},
	}

	_, ints := LenRandomValueRandom(10, 10)
	fmt.Println(ints)
	for _, v := range ints {

		shed.Push(v)
	}
	fmt.Println(shed.GetMin())
}
